package Day_0219.Redis;

/**
 * @author zxc
 * @date 2023/02/19 14:08
 **/
public class Redis_Asynchronous_Queue {
    public static void main(String[] args) {
        /**
         * 使用Redis实现异步队列
         * ===》
         * 1.一般使用list结构作为队列，rpush生产消息（即，向list中生产消息），lpop消费消息（即，从list中拿取消息）。
         * 当lpop没有消息的时候，要适当sleep一会再重试。
         * （即，当list中没有消息可以被消费者进行消费的话，则需要适当阻塞消费者;）
         *
         * 2.如果对方追问可不可以不用sleep呢？
         * ===>
         * list还有个指令叫blpop，在没有消息的时候，它会阻塞住直到消息到来。
         *
         * 3.如果对方追问能不能生产一次消费多次呢？
         * ===>
         * （1）那么就不使用list数据结构来实现异步队列，选择使用 pub/sub主题订阅者模式，可以实现1:N的消息队列。
         * （2）pub/sub主题订阅模式，即能够实现 1 ：N的消息队列（即，生产一个消息，能够被多个消费者进行消费）
         *
         * 4.如果对方追问pub/sub有什么缺点？
         * ===》
         * 在消费者下线的情况下，生产的消息会丢失，得使用专业的消息队列如rabbitmq等。
         *
         * 5.redis如何实现延时队列？
         * ===》
         * （1）使用sorted set，拿时间戳作为score，消息内容作为key，调用zadd来生产消息，
         * （2）消费者用zrange by score指令获取N秒之前的数据轮询进行处理。
         *
         */
    }
}
